#include "char.h"

Font *g_currentFont;

// 字库1（8x8）
Font font_8x8 = {
    FONT_8x8_WIDTH, FONT_8x8_HEIGHT,
    font_8x8_chars // 字库1的字符数据数组
};

// 字库2（16x16）
Font font_16x16 = {
    FONT_16x16_WIDTH, FONT_16x16_HEIGHT,
    font_16x16_chars // 字库2的字符数据数组
};

bool IsBitmpaSizeValid(const Font *font, const CharBitmap &bitmap)
{
    // 计算每行所需字节数
    int bytes_per_row = (font->width + 7) / 8;

    // 计算整个字符点阵的总字节数
    size_t expected_bitmap_size = font->height * bytes_per_row;

    // 判断实际大小和计算大小是否一致
    return bitmap.size() == expected_bitmap_size;
}

const CharBitmap *FindCharBitmap(const Font *font, uint32_t unicode)
{
    // 遍历字符集数组，查找字符
    for (const auto &char_encoding : font->chars)
    {
        if (char_encoding.unicode == unicode)
        {
            return &char_encoding.bitmap;
        }
    }
    return nullptr; // 如果没有找到，返回 nullptr
}

void PrintBitmap(const CharBitmap *bitmap)
{
    if (bitmap == nullptr)
    {
        std::cout << "Character not found.\n";
        return;
    }

    if (!IsBitmpaSizeValid(g_currentFont, *bitmap))
    {
        std::cout << "bitmap_size_invalid.\n";
        return;
    }

    std::cout << "bitmap_size_valid.\n";

    // 打印字符点阵
    for (int i = 0; i < g_currentFont->height; i++)
    {
        for (int j = 0; j < g_currentFont->width / 8; j++)
        {
            // 逐个字节读取每行的点阵数据
            unsigned char byte = (*bitmap)[i * (g_currentFont->width / 8) + j];

            // 对当前字节中的每一位进行检查并输出对应的字符
            for (int bit = 7; bit >= 0; bit--)
            {
                if (byte & (1 << bit))
                {
                    std::cout << "#";
                }
                else
                {
                    std::cout << " ";
                }
            }
        }
        std::cout << "\n";
    }
}

void TestFont(const Font *font, uint32_t unicode)
{
    const CharBitmap *bitmap = FindCharBitmap(font, unicode);
    PrintBitmap(bitmap);
}

int TesChar()
{
    // 测试 8x8 字库
    g_currentFont = &font_8x8;
    TestFont(g_currentFont, L'A');
    TestFont(g_currentFont, L'B');

    // 测试 16x16 字库
    g_currentFont = &font_16x16;
    TestFont(g_currentFont, L'A');
    TestFont(g_currentFont, L'B');

    return 0;
}
